// #include<iostream>
// using namespace std;

// struct loc{
// 	int x, y;
// }hr[9];
// int tx, ty, ans = 0;

// int dx[8] = {2,1,-1,-2,-2,-1,1,2};
// int dy[8] = {1,2,2,1,-1,-2,-2,-1};

// void dfs(int x, int y) {
// 	if(x>tx || y>ty)	return;
// 	if(x==tx && y==ty) {
// 		ans++;
// 		return ;
// 	}
// 	for(int i=0; i<9; i++) {
// 		if(x==hr[i].x && y==hr[i].y)
// 			return;
// 	}
// 	dfs(x+1, y);
// 	dfs(x, y+1);
// }

// int main() {
// 	cin >> tx >> ty >> hr[0].x >> hr[0].y;
// 	for(int i=0; i<8; i++) {
// 		hr[1+i].x = hr[0].x + dx[i];
// 		hr[1+i].y = hr[0].y + dy[i];
// 	}
// 	dfs(0, 0);
// 	cout << ans << endl;
// 	return 0;
// }

#include<iostream>
#include<cstring> // 新增头文件
using namespace std;

struct loc{
	int x, y;
}hr[9];
// ... 原有变量定义改为：
long long dp[25][25]; // 使用long long防止溢出
bool block[25][25];   // 标记障碍点

int dx[8] = {2,1,-1,-2,-2,-1,1,2};
int dy[8] = {1,2,2,1,-1,-2,-2,-1};

int main() {
	int tx, ty, hx, hy;
	cin >> tx >> ty >> hx >> hy;
	
	// 初始化障碍点
	memset(block, 0, sizeof(block));
	for(int i=0; i<8; i++) {
		int nx = hx + dx[i];
		int ny = hy + dy[i];
		if(nx >=0 && ny >=0) // 添加越界检查
			block[nx][ny] = true;
	}
	block[hx][hy] = true; // 马的位置也是障碍
	
	// 动态规划
	dp[0][0] = 1;
	for(int i=0; i<=tx; i++){
		for(int j=0; j<=ty; j++){
			if(block[i][j]) {
				dp[i][j] = 0;
				continue;
			}
			if(i > 0) dp[i][j] += dp[i-1][j];
			if(j > 0) dp[i][j] += dp[i][j-1];
		}
	}
	cout << dp[tx][ty] << endl;
	return 0;
}